<?php
/**
 * @see ZendX_JQuery_View_Helper_UiWidget
 */
require_once "ZendX/JQuery/View/Helper/UiWidget.php";

/**
 * Помощник вида, реализующий выбор элементов для модуля форм
 * 
 * @category Phorm
 * @package JQuery_View_Helper
 * @name /Phorm/JQuery/View/Helper/FormsElements.php
 * @copyright phorm.ru
 * @since 20.02.2012
 * @author vladimir@kachalov.net
 */

class Phorm_JQuery_View_Helper_FormsElements extends ZendX_JQuery_View_Helper_UiWidget {
	
	/**
	 * Рисуем элемент
	 *
	 * @param string $id Id HTML-элемента
	 * @param string $value Значение элемента
	 * @param array $params Массив параметров элемента @see Phorm_JQuery_Form_Element_FormsElements
	 * @param array $options Список опций для селекта
	 * @return string
	 */
    
	public function formsElements($id, $value = null, array $params = array(), array $options = array()) {
		
		$translate = $params['translate'];
		
		/**
		 * Формируем селект для выбора типа поля
		 */
		
		$attribs = array('id' => $id . '_select');
		foreach ($params as $k=>$v) if(is_string($v)) $attribs[$k] = $v;
	    $select = $this->view->formSelect($id . '_select', null, $attribs, $options);
	    
	    /**
	     * Формируем кнопку добавления нового поля
	     */
	    
	    $button = $this->view->button($id . '_add', $translate->_('Добавить'));
	    
	    /**
	     * Отрисовываем существующие значения
	     */
	    
	    $ul = '<ul>';
	    
	    foreach ($params['vforms'] as $key=>$form) {
	    	$form -> setElementsBelongTo('fields['.$key.']');
	    	$ul .= '<li>' . $form->render() . '</li>';
	    }
	    
	    $ul .= '<li class="hidden"></li></ul>';
	    
	    /**
	     * Определяем иконки редактирования/удаления
	     */
	    
	    $icon_edit   = '<a href="#" class="edit ui-corner-all ui-button ui-state-default" title="'.$translate->_('Редактировать').'"><span class="ui-icon ui-icon-pencil"></span></a>';
	    $icon_delete = '<a href="#" class="edit ui-corner-all ui-button ui-state-default" title="'.$translate->_('Удалить').'"><span class="ui-icon ui-icon-close"></span></a>';
	    
	    /**
	     * Добавляем массив форм в JS
	     * Вешаем событие на кнопку добавления элемента формы
	     * Скрываем существующие формы элементов при загрузке страницы и добавляем на них иконки
	     * @todo Слишком много яваскрипта в помощнике. Мб стоит вынести в /ui/phorm/phorm.js и сделать плагином JQuery
	     */
	    
	    $this->jquery->addJavascript('var Forms_Forms = ' . ZendX_JQuery::encodeJson($params['renders']));
	    $this->jquery->addOnLoad('
	    	$("#' . $id . '-element ul li > dl > dt").remove(); // Удаляем пространство между филдсетами
	    	$("#' . $id . '-element dl.zend_form dl").hide();
		    $("#' . $id . '-element dl.zend_form fieldset").each(function(){
		    	$(this).css("position","relative");
		    	var hld = $("<div style=\"position:absolute;top:15px;left:11px;\">" + $(this).find("input[type=text]:first").val() + "</div>");
		    	$(this).find("dl").before(hld);
		    	$(this).find("dl").before($("'.addslashes($icon_delete).'").click(function(){
		    		if(confirm("'.$translate->_('Удалить элемент').'?")) {
		    			$(this).parent("fieldset").parent("dd").parent("dl").remove();
		    		}
		    		return false;
		    	}).css("position","absolute").css("top","15px").css("right","5px"));
		    	$(this).find("dl").before($("'.addslashes($icon_edit).'").click(function(){
		    		$(this).parent("fieldset").find("dl").toggle(0,function(){
		    			if($(this).is(":visible")) { hld.hide(); } else { hld.show(); }
		    		});
		    		return false;
		    	}).css("position","absolute").css("top","15px").css("right","28px"));
		    });
		    $("#' . $id . '-element ul").sortable().find("li").css("cursor","move");
		    $("#' . $id . '_add").click(function(){
		    	var Tmpl = $(this).prev("select").val();
		    	if(Forms_Forms[Tmpl]) {
		    		var itr = $("#' . $id . '-element ul li").length-1;
		    		var Tmpl = Forms_Forms[Tmpl].replace(/name=\"fields\[\]\[/g,"name=\"fields["+itr+"][");
		    		var li = $(this).next("ul").find("li:last").clone(true)
		    				.insertBefore($(this).next("ul").find("li:last")).html(Tmpl).show();
		    		li.find("> dl > dt").remove(); // Удаляем пространство между филдсетами
		    		li.find("fieldset").css("position","relative");
		    		li.find("dl.zend_form dl").before($("'.addslashes($icon_delete).'").click(function(){
			    		if(confirm("'.$translate->_('Удалить элемент').'?")) {
			    			$(this).parent("fieldset").parent("dd").parent("dl").remove();
			    		}
			    		return false;
			    	}).css("position","absolute").css("top","15px").css("right","5px"));
			    	li.find("dl.zend_form dl").before($("'.addslashes($icon_edit).'").click(function(){
			    		var fieldname = $(this).parent("fieldset").find("input[type=text]:first").val();
			    		var hld = $("<div style=\"position:absolute;top:15px;left:11px;\">" + fieldname + "</div>");
			    		if(fieldname !="") {
			    			$(this).prev("div").remove();
			    			$(this).before(hld);
			    		}
			    		$(this).parent("fieldset").find("dl").toggle(0,function(){
			    			if($(this).is(":visible")) { hld.hide(); } else { hld.show(); }
			    		});
			    		return false;
			    	}).css("position","absolute").css("top","15px").css("right","28px"));
		    	}
		    });
	    ');
	    
	    return $select . ' ' . $button . ' ' . $ul;
		
	}
	
}